#include <iostream>
#include <memory>
#include "UdpServer.hpp"
#include "Route.hpp"
#include "ThreadPool.hpp"

using namespace ThreadPoolModule;

using task_t = std::function<void()>; // 任务类型定义, 任务为 无参,无返回值 函数

// 回调函数1 (默认测试函数)
std::string DefaultHandler(const std::string &message) // 默认回调函数
{
    std::string testMessage = "test for callback, " + message;
    return testMessage;
}

// 命令行格式: ./UdpServer ip port
// 例如: ./UdpServer 127.0.0.1 8080
int main(int argc, char *argv[])
{
    // 检查命令行参数格式
    if (argc != 2)
    {
        std::cerr << "Usage: " << argv[0] << " port" << std::endl; // 用户输入错误，给出正确格式提示
        return 1;
    }

    // 由命令行参数获取IP地址和端口号
    /* std::string ip = argv[1]; // IP地址 */
    int port = std::stoi(argv[1]); // 端口号

    Enable_Console_Log_Strategy(); // 启用控制台日志策略

    // 创建路由对象
    Route r;

    // 创建线程池对象
    auto tp = ThreadPool<task_t>::GetInstance();

    // 使用智能指针创建sever对象
    std::unique_ptr<UdpServer> server = std::make_unique<UdpServer>(/* ip, */ port,
                                                                    [&r, &tp](int sockfd, const std::string &message, InetAddr &addr)
                                                                    {
                                                                        task_t task = std::bind(&Route::MessageRoute, &r, sockfd, message, addr); // 绑定路由函数和参数
                                                                        tp->Enqueue(task);                                                        // 添加任务到线程池
                                                                    });

    /* /* std::unique_ptr<UdpServer> server = std::make_unique<UdpServer>(/* ip, */ port,
                                                                    [&r](int sockfd, const std::string &message, InetAddr &addr)
                                                                    {
        r.MessageRoute(sockfd, message, addr); 
                                                                    }
                                                                ); // 函数采用lamda表达式  */*/

    server->init();  // 服务器初始化
    server->start(); // 服务器启动

    return 0;
}